<?php

1->日志配置
   log4j:
   1. [pom]
   <dependency>
       <groupId>net.logstash.log4j</groupId>
       <artifactId>jsonevent-layout</artifactId>
       <version>1.7</version>
   </dependency>

   2. [配置文件]
      log4j.appender.RollFileToLogCenter=org.apache.log4j.RollingFileAppender
      log4j.appender.RollFileToLogCenter.Threshold=error
      log4j.appender.RollFileToLogCenter.File=/var/log/app/应用名称.log
      log4j.appender.RollFileToLogCenter.layout=net.logstash.log4j.JSONEventLayoutV1
      log4j.appender.RollFileToLogCenter.layout.UserFields=application:应用名称
      log4j.appender.RollFileToLogCenter.MaxFileSize=10MB
      log4j.appender.RollFileToLogCenter.MaxBackupIndex=10

   log4j2: 附录/日志/log4j2.php

   logback: 附录/日志/logback.php


2->XML解析
   说明:
   最近一些开发小伙伴在使用xstream解析xml报文的时候，可能会遇到一些问题，比如，当合作方报文中有节点增加或减少的情况，我方解析时会报错。因此做一个简单的xstream用法分享
   使用: 附录/xml解析/xml解析.php


3->RedisPlus (redis分析利器)
   说明: 这是一款用于监控[Redis]的可视化界面
   码云: https://gitee.com/MaxBill/RedisPlus?_from=gitee_search

   批量删除redis前缀key:
   public class RedisClusterUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    public void scan(String pattern) {
        redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
            Set<String> keysTmp = new HashSet<>();
            try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
                    .match(pattern)
                    .count(1000).build())) {

                while (cursor.hasNext()) {
                    String next = new String(cursor.next(), "Utf-8");
                    System.out.println(next);
                    this.delete(next);
                }
                System.out.println(keysTmp.size());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return keysTmp;
        });
       }
    }


4->Skywalking__结合__ELK__链路追踪
   说明: 该文档是基于'logback文件'进行整合
   1. [pom]
      <dependency>
         <groupId>org.apache.skywalking</groupId>
         <artifactId>apm-toolkit-logback-1.x</artifactId>
         <version>8.3.0</version>
      </dependency>

   2. logback日志的encoder配置中添加对应provider
      <springProfile name="tx-uat">

        <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE_INFO">
          <file>${Log_home}/${applicationName}.log</file>
          <encoder class="com.sinosoft.platform.common.logDesensitization.Logstash.LogstashEncoderPlus">
              <provider class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.logstash.TraceIdJsonProvider"/>
              <customFields>{"application":"${applicationName}","host":"${hostName}","logenv":"${env}"}</customFields>
          </encoder>
          <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
              <fileNamePattern>${Log_home}/${applicationName}%i.log</fileNamePattern>
              <minIndex>1</minIndex>
              <maxIndex>9</maxIndex>
          </rollingPolicy>
          <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
              <maxFileSize>100MB</maxFileSize>
          </triggeringPolicy>
        </appender>
       <root level="INFO">
          <appender-ref ref="FILE_INFO"/>
       </root>
     </springProfile>

   3. 重新发布应用
      可以看到，通过traceId可以查询到一次同步请求中的所有涉及到的服务日志 (traceId对应Kibana条件搜索的TID，新增加的组件可能要刷新一下kibana管理界面的索引)
      并且通过traceId，也可以在skywalking中查询到该次请求的全链路信息。
      该方案将已有的ELK日志平台与skywalking链路追踪结合了起来，做到了单次请求的可追踪化，skywalking的使用也由之前的看下某个接口宏观性能变成了细粒度到单次请求的级别。
      这对于日常查询日志和定位问题起到了很大的帮助



5->映射小技巧
   说明: 实际开发中，我们一定遇到过这样的问题：前端显示和后台存储数据单位不统一，而且各有各自的理由，统一不了，那就只能由后端转换。
   每次返回给前端时再转换一遍，返回给前端的json数据，在后端里定义的往往是一个对象，如何做到优雅的转换呢？只需两步操作:

   [step1]: 写一个负责转换的类，里面写好规则
   public class MySerializerUtils extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        String statusStr = "";
         switch (status) {
             case 0:
                 statusStr = "新建状态";
                 break;
             case 1:
                statusStr = "就绪状态";
                 break;
             case 2:
                 statusStr = "运行状态";
                 break;
             case 3:
                 statusStr = "阻塞和唤醒线程";
                 break;
             case 4:
                statusStr = " 死亡状态";
               break;
             default:
                 statusStr = "状态信息不符合";
         }
         jsonGenerator.writeString(statusStr);
        }
    }

    [step2]: 在实体类上需要装换的字段上加上注解
    /**
    * 多线程生命周期状态值
    */
    @JsonSerialize(using = MySerializerUtils.class)
    private int status;

    注:@JsonSerialize注解,主要应用于数据转换,该注解作用在该属性的getter()方法上。



6->NFS (服务器之间数据映射, 一个服务器有数据, 另一个服务器可以通过映射获取另一个服务器上的数据)
教程:
1-> https://blog.csdn.net/qq_38265137/article/details/83146421
2-> https://blog.csdn.net/qq_36306340/article/details/82886605

'服务端安装NFS服务步骤'
安装nfs服务: yum install -y  nfs-utils
安装rpc服务: yum install -y rpcbind
设置开机启动: systemctl enable rpcbind

启动(rpc要先启动)
sudo systemctl start rpcbind
sudo systemctl start nfs

停止:
sudo systemctl stop rpcbind
sudo systemctl stop nfs

重启:
sudo service rpcbind restart
sudo service nfs restart

查看:
sudo service rpcbind status
sudo service nfs status


'开始配置-服务端'
0. 启动服务
1、首先需要在主机上设置允许挂载的目录
修改 /etc/exports, 增加共享目录

这里主机是指服务端(要共享的目录)
共享目录的路径 192.168.242.*(ro,sync,no_root_squash)
/srv/www/app/wtcms/webroot/main 192.168.242.*(ro,sync,no_root_squash)

'其中'
/srv/www/app/wtcms/webroot/upload
/srv/www/app/wtcms/webroot/main
是指服务端要共享的两个目录 192.168.242.* 客户端的ip(允许访问的ip)

2. 关闭服务端的防火墙。

3. 重新加载NFS服务，使配置文件生效
sudo systemctl reload nfs

4. 重启服务:
sudo service nfs restart
sudo service rpcbind restart

5. 查看当前服务器对外提供的访问ip
sudo showmount -e 当前ip
注意: 如果报错的话，就把2个服务重启

'开始配置-客户端'
1. 启动服务
sudo systemctl start rpcbind  (先启动)
sudo systemctl start nfs

2.sudo mount -t nfs 服务端ip:开放的路径 客户端映射的路径

3. 查看是否映射成功: df -h

'防火墙命令'
1: 查看防火状态
systemctl status firewalld
service  iptables status

2: 暂时关闭防火墙
systemctl stop firewalld
service  iptables stop

3: 永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off

4: 重启防火墙
systemctl enable firewalld
service iptables restart

出现问题解决:
https://www.cnblogs.com/rxbook/p/8110143.html
https://blog.csdn.net/qq_33559992/article/details/51866043



7->




8->



9->





.
